package tds.model8.version2;

import net.sf.cglib.proxy.Enhancer;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author tds
 * @version 1.0.0
 * @Company 杭州先锋电子技术股份有限公司
 * @ClassName BootStrap
 * @Description TODO（这里用一句话描述这个类的作用)
 * @Date 2021-04-22 11:08
 */
public class BootStrap {
    public static void main(String[] args) {
        // 基于jdk的动态代理
        System.out.println("---------------基于jdk的动态代理--------------------");
        Subject subject = new SubjectImpl();
        InvocationHandler handler = new SubjectHander(subject);
        // Proxy：这是 Java 动态代理机制的主类，它提供了一组静态方法来为一组接口动态地生成代理类及其对象
        // Proxy 静态方法生成动态代理类同样需要通过类装载器来进行装载才能使用，它与普通类的唯一区别就是其字节码是由
        // JVM 在运行时动态生成的而非预存在于任何一个.class 文件中。
        Subject proxyInstance = (Subject) Proxy.newProxyInstance(handler.getClass().getClassLoader(),
                subject.getClass().getInterfaces(), handler);
        proxyInstance.hello("你好");
        proxyInstance.gun("滚！");

        // cglib的动态代理
        System.out.println("---------------cglib的动态代理--------------------");
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(CgSubject.class);
        enhancer.setCallback(new HelloInterceptor());
        CgSubject cgSubject = (CgSubject) enhancer.create();
        cgSubject.sayHello("哈哈");
        cgSubject.gun("爬");
        cgSubject.toString();
    }
}
